// 本页面称承载来自多个页面的详细列表展示，故数据格式都要统一
import {
  getBangList, // 获取榜单
  getHotSongList, // 获取歌单
  getHotSingerSongList, // 获取歌手单
  search, // 获取搜索单
  getSongPlay // 获取歌url
} from "../../utils/http"
const audio = getApp().audio
Page({
  pageNumber: 1, // 起始页
  prevSongId: null, // 上一次播放的歌曲id
  nowSongId: null, // 本次播放的歌曲id
  bangId: "new", // 可以是多个类型的id：榜单id / 歌单id / 歌手id / 搜索词。默认值：榜单id=new
  fromType: "bang", // 页面来源。默认榜单：bang。歌单：song。歌手：singer。搜索：search
  data: {
    playWay: false, // 播放方式。单曲:false , 全部:true
  },
  onLoad(e) {
    this.bangId = e.id
    this.fromType = e.type
    e.navtitle ? wx.setNavigationBarTitle({
      title: e.navtitle,
    }) : null
    this.getSong()
  },
  onShow() {
    // 监听背景音频播放事件
    audio.onPlay(() => {
      console.log("播放")
      let index = this.data.songList.findIndex(item => item.songId == this.nowSongId)
      if (index > -1) {
        this.setData({
          [`songList[${index}].status`]: "playing",
          isPlaying: true,
          nowSongIndex: index
        })
      }
    })
    // 监听用户在系统音乐播放面板点击上一曲事件的监听函数
    audio.onPrev(() => {
      this.playPrevAudio()
    })
    // 监听用户在系统音乐播放面板点击下一曲事件
    audio.onNext(() => {
      this.playNextAudio()
    })
    // 监听背景音频自然播放结束事件
    audio.onEnded(() => {
      console.log("自然结束")
      let index = this.data.songList.findIndex(item => item.songId == this.nowSongId)
      if (index > -1) {
        this.setData({
          [`songList[${index}].status`]: "stop",
          isPlaying: false,
          nowSongIndex: index
        })
        if (this.data.playWay) {
          this.playNextAudio()
        } else(
          this.startPlayAudio()
        )
      }
    })
    // 监听背景音频暂停事件
    audio.onPause(() => {
      console.log("暂停")
      let index = this.data.songList.findIndex(item => item.songId == this.nowSongId)
      if (index > -1) {
        this.setData({
          [`songList[${index}].status`]: "pauseing",
          isPlaying: false,
          nowSongIndex: index
        })
      }
    })
    // 监听背景音频停止事件
    audio.onStop(() => {
      console.log("停止")
      // 停止播放的歌曲时，将播放状态设为stop。
      let index = this.data.songList.findIndex(item => item.songId == this.prevSongId)
      let index2 = this.data.songList.findIndex(item => item.songId == this.nowSongId)
      if (index > -1) {
        this.setData({
          [`songList[${index}].status`]: "stop",
          isPlaying: false,
          nowSongIndex: index2
        })
      }
    })
  },
  // 加载Song列表
  async getSong() {
    let songList = this.data.songList || []
    wx.showLoading({
      title: '',
      mask: true
    })
    let res = this.fromType == "bang" ? await getBangList({
      bangId: this.bangId,
      pageNumber: this.pageNumber
    }) : this.fromType == "song" ? await getHotSongList({
      typeId: this.bangId,
      pageNumber: this.pageNumber
    }) : this.fromType == "singer" ? await getHotSingerSongList({
      singerId: this.bangId,
      pageNumber: this.pageNumber
    }) : this.fromType == "search" ? await search({
      word: this.bangId,
      pageNumber: this.pageNumber
    }) : null
    wx.hideLoading()
    if (!res) {
      return wx.showToast({
        title: "数据错误",
        icon: "none"
      })
    }
    if (res.code !== 200) {
      return wx.showToast({
        title: res.msg || "数据错误",
        icon: "none"
      })
    }
    songList.push(...res.list)
    this.setData({
      songList,
      hasMore: res.totalPage > res.nowPageNumber,
      totalPage: res.totalPage,
      nowPageNumber: res.nowPageNumber
    })
  },
  // 加载SongList歌曲数据并播放
  async getSongListData(songId) {
    wx.showLoading({
      title: '',
      mask: true
    })
    let res = await getSongPlay({
      songId
    })
    wx.hideLoading()
    if (!res.code || res.code !== 200) {
      setTimeout(() => {
        this.playNextAudio()
      }, 2000)
      return wx.showToast({
        title: res.msg + "。即将尝试播放下一曲",
        icon: 'none',
        duration: 2000
      })
    }
    if (!res.data.url) {
      setTimeout(() => {
        this.playNextAudio()
      }, 2000)
      return wx.showToast({
        title: "歌曲链接丢失，即将尝试播放下一曲",
        icon: 'none',
        duration: 2000
      })
    }
    // 根据本次要播放的歌曲id，找出相关数据
    let index = this.data.songList.findIndex(item => item.songId == this.nowSongId)
    let item = this.data.songList[index]
    audio.stop()
    audio.src = res.data.url
    audio.title = item.title
    audio.singer = item.singer
    audio.coverImgUrl = res.data.pic
    audio.play()
    this.setData({
      [`songList[${index}].songData`]: res.data
    })
  },
  // 加载更多
  loadMore() {
    if (this.data.hasMore) {
      this.pageNumber += 1
      this.getSong()
    }
  },
  // 暂停
  pauseAudio() {
    audio.pause()
  },
  // 点击播放按钮
  playAudio(e) {
    this.nowSongId = e.currentTarget.dataset.id
    this.startPlayAudio()
  },
  // 点击控件播放按钮
  playAudioFromControl() {
    if (audio.src) {
      audio.play()
    }
  },
  // 点击控件暂停按钮
  pauseAudioFromControl() {
    audio.pause()
  },
  // 上一首
  playPrevAudio() {
    // 找出当前歌曲id对应的array下标，如果发现已经是第一首，表示没有上一首了，那么可以从array的最后往前再来播放
    let index = this.data.songList.findIndex(item => item.songId == this.nowSongId)
    if (index <= 0) {
      this.nowSongId = this.data.songList[this.data.songList.length - 1].songId
    } else {
      this.nowSongId = this.data.songList[index - 1].songId
    }
    this.startPlayAudio()
  },
  // 下一首
  playNextAudio() {
    let index = this.data.songList.findIndex(item => item.songId == this.nowSongId)
    if (index < this.data.songList.length - 1) {
      this.nowSongId = this.data.songList[index + 1].songId
    } else {
      this.nowSongId = this.data.songList[0].songId
    }
    this.startPlayAudio()
  },
  // 切换播放方式
  changePlayWay() {
    this.setData({
      playWay: !this.data.playWay
    })
  },
  // 播放指定歌曲
  async startPlayAudio() {
    // 筛选出匹配songId的数据
    let item = this.data.songList.filter(item => item.songId == this.nowSongId)[0]
    // 判断上一次播放的歌曲与本次是否相同。
    // 1、相同：继续播放（前一次没放完）/ 开始播放（前一次没放过）/ 重新播放（前一次放过了）
    // 2、不同：结束上次的播放状态，并设置新的播放记录
    if (this.prevSongId == this.nowSongId) {
      console.log("前后是同一首歌")
      // 前一次放过了，状态stop，且有歌词
      if (item.status && item.status == "stop" && item.songData) {
        console.log("当前状态stop且有歌词")
        audio.src = item.songData.url
        audio.title = item.title
        audio.singer = item.singer
        audio.coverImgUrl = item.songData.pic
        audio.play()
      }
      // 前一次没放完，状态pauseing，继续播放
      else if (item.status && item.status == "pauseing") {
        console.log("当前状态pauseing，继续播放")
        audio.play()
      }
      // 当前没有状态（意外缺失），有歌词就播放
      else if (item.songData) {
        console.log("当前没有状态（意外缺失），有歌词就播放")
        audio.stop()
        audio.src = item.songData.url
        audio.title = item.title
        audio.singer = item.singer
        audio.coverImgUrl = item.songData.pic
        audio.play()
      } else {
        // 一穷二白（清理过微信数据），获取数据
        console.log("一穷二白（清理过微信数据），获取数据")
        await this.getSongListData(item.songId)
      }
    } else { // 前后不是同一首歌，先停止前一首播放
      if (item.songData) {
        audio.stop()
        console.log("前后不是同一首歌，但有歌词，直接播放")
        audio.src = item.songData.url
        audio.title = item.title
        audio.singer = item.singer
        audio.coverImgUrl = item.songData.pic
        audio.play()
      } else {
        console.log("前后不是同一首歌，且无歌词，先获取再播放")
        await this.getSongListData(item.songId)
      }
    }
    // 重置上次播放id为本次的，之所以用定时，是因为音频组件在监听，它会慢一点
    setTimeout(() => {
      this.prevSongId = this.nowSongId
    }, 100)
  },
  collection(e) {
    let {
      id
    } = e.currentTarget.dataset
    let music = this.data.songList.filter(item => item.songId == id)[0]
    delete music.status // 删除状态
    delete music.songData // 删除歌词曲信息（歌曲链接存在时效问题，需要每次获取新的）
    let collectionMusic = wx.getStorageSync('collectionMusic') || []
    // 循环收藏，找出是否收藏过
    let find_i = collectionMusic.findIndex(item => item.songId == id)
    if (find_i !== -1) { // 同id的歌曲被收藏过，删除原记录。后续会将数据添加到第一个
      collectionMusic.splice(find_i, 1)
    }
    collectionMusic.unshift(music)
    wx.setStorage({
      key: "collectionMusic",
      data: collectionMusic,
      success: () => {
        wx.showToast({
          title: '已加入收藏',
          icon: 'none'
        })
      }
    })
  },
})